const path = require('path')
const querystring = require('querystring')

// 导入配置项
const config = require(path.join(__dirname,"config"))

// 分类模型
const categoryModel = require(path.join(__dirname,"model/categoryModel"))
const productModel = require(path.join(__dirname,"model/productModel"))
const cartModel = require(path.join(__dirname,"model/cartModel"))

// 自定义全局返回中间件
exports.global = (req,res,next) => {
    res.locals.site = config.site

    // 设置已登录的用户数据
    res.locals.user = req.session.user

    // 判读缓存中是否有数据，如果有，则返回缓存中的数据，如果没有，则去加载
    /** 
    if (!req.app.locals.categories) {
        // 设置分类
        categoryModel.getCategoryTree().then(categories=>{
            res.locals.categories = categories

            // 把加载到的分类数据缓存起来
            req.app.locals.categories = categories

            next()
        }).catch(err=>next(err))
    } else {
        // 从缓存中取出分类数据并且设置
        res.locals.categories = req.app.locals.categories
        
        next()
    }
    */

    // 获取分类信息，缓存中有就从缓存中取，如果没有，就去查询
    const getCategories = () => {
        if (!req.app.locals.categories) {
            // 设置分类
            return categoryModel.getCategoryTree().then(categories=>{
                // 渲染页面需要用到的分类数据
                res.locals.categories = categories
    
                // 把加载到的分类数据缓存起来
                req.app.locals.categories = categories
            }).catch(err=>next(err))
        } else {
            // 从缓存中取出分类数据并且设置
            res.locals.categories = req.app.locals.categories

            return Promise.resolve()
        }
    }

    // 获取购物车信息，分为登录和未登录
    const getCart = () => {
        if (req.session.user){ // 登录了
            return cartModel.find(req.session.user.id).then(products=>{
                // 头部数据，只需要购物车的总数和商品名称列表
                res.locals.headerCart = {
                    list:products.map(item=>item.name),
                    amount:products.reduce((prev,item) => prev + (item.amount - 0),0) //叠加遍历操作
                }
            })
        } else { // 未登录
            //1、获取浏览器cookie中保存的商品信息
            const cartCookie = req.cookies[config.cookie.cart_cookie_key] || '[]'

            //2、转成js数组
            const cartList = JSON.parse(cartCookie)

            //3、根据cartList生成对应个数的Promise数组
            const promiseArray = cartList.map((item,i)=>{
                return productModel.getProduct(item.goodsId,true)
            })

            //4、发送请求，获取商品信息
            return Promise.all(promiseArray).then(products => {
                // 头部数据，只需要购物车的总数和商品名称列表
                res.locals.headerCart = {
                    list:products.map(item=>item.name),
                    amount:cartList.reduce((prev,item) => prev + (item.amount - 0),0) //叠加遍历操作
                }
            })
        }
    }

    // 同时去获取分类信息和购物车数据，成功之后next
    Promise.all([getCategories(),getCart()]).then(()=>{
        next()
    }).catch(err=>next(err))
}

// 检查是否登录了
exports.checkLogin = (req,res,next) => {
    if (!req.session.user) { // 未登录
        return res.redirect('/login?returnUrl='+querystring.escape(req.url))
    }

    // 登录了，继续下一个中间件
    next()
}